package com.qing.springbootinit.bizmq;

import com.qing.springbootinit.common.ErrorCode;
import com.qing.springbootinit.exception.BusinessException;
import com.qing.springbootinit.exception.ThrowUtils;
import com.qing.springbootinit.manager.AiManager;
import com.qing.springbootinit.manager.DeepAiManger;
import com.qing.springbootinit.model.entity.Chart;
import com.qing.springbootinit.model.enums.ChartStatusEnum;
import com.qing.springbootinit.service.ChartService;
import com.rabbitmq.client.Channel;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

// * @author <a href="https://github.com/qingfengzy">qingfengzy</a>

@Component
@Slf4j
public class BiMessageConsumer {

        @Resource
        private DeepAiManger deepAiManger;

        @Resource
        private AiManager aiManager;

        @Resource
        private ChartService chartService;
        @SneakyThrows
        @RabbitListener(queues = {BiMqConstant.BI_QUEUE_NAME},ackMode = "MANUAL")
        public void receiveMessage (String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliverTag){

                log.info("message = {}",message);
                if(StringUtils.isBlank(message)){
                        channel.basicNack(deliverTag,false,false);
                        throw new BusinessException(ErrorCode.SYSTEM_ERROR,"消息为空");
                }
//                这里的message就是传的是id
                long chartId = Long.valueOf(message);

                Chart updateChart = new Chart();
                Chart chart = chartService.getById(chartId);
                if(chart==null){
                        throw new BusinessException(ErrorCode.PARAMS_ERROR,"图表为空");
                }
                String aiType = chart.getAiType();
                updateChart.setId(chartId);
                // 先修改图表任务状态为 “执行中”。等执行成功后，修改为 “已完成”、保存执行结果；执行失败后，状态修改为 “失败”，记录任务失败信息。(为了防止同一个任务被多次执行)
                updateChart.setStatus(ChartStatusEnum.RUNNING.getValue());
                boolean b = chartService.updateById(updateChart);
                if(!b){
                        // 如果提交失败(一般情况下,更新失败可能意味着数据库出问题了)
                        handleChartUpdateError(chartId,"更新图标执行中状态失败");
                        return;
                }

                String[] splits;
                if(aiType.equals("DeepSeek")){
                        String aiResult = deepAiManger.doChat( 12, buildUserInput(chart));
                        splits = aiResult.split("【【【【【");
                }else{
                        String aiResult = aiManager.doChat(true , buildUserInput(chart));
                        splits = aiResult.split("'【【【【'");

                }

                if(splits.length<3){
                        throw new BusinessException(ErrorCode.SYSTEM_ERROR,"AI生成错误");
                }
                String chartCode = splits[1].trim();
                String analyzeResult = splits[2].trim();
                Chart updateChartResult = new Chart();
                updateChartResult.setId(chartId);
                updateChartResult.setGenChart(chartCode);
                updateChartResult.setGenResult(analyzeResult);
                updateChartResult.setStatus(ChartStatusEnum.SUCCEED.getValue());
                boolean updateResult = chartService.updateById(updateChartResult);
                if(!updateResult){
                        handleChartUpdateError(chartId,"更新图表成功状态失败");
                }


                ThrowUtils.throwIf(!updateResult, ErrorCode.PARAMS_ERROR,"图表保存失败");

//                手动确认消费信息
                channel.basicAck(deliverTag,false);

        }
        private void handleChartUpdateError(long chartId, String execMessage) {
                Chart updateChartResult = new Chart();
                updateChartResult.setId(chartId);
                updateChartResult.setStatus("failed");
                updateChartResult.setExecMessage("execMessage");
                boolean updateResult = chartService.updateById(updateChartResult);
                if (!updateResult) {
                        log.error("更新图表失败状态失败" + chartId + "," + execMessage);
                }
        }
        private String buildUserInput(Chart chart){

                String goal = chart.getGoal();

                String chartType = chart.getChartType();

                String csvData = chart.getChartData();

//                String aiType = chart.getAiType();

                StringBuilder userInput = new StringBuilder();
                userInput.append("你是一个数据分析师，接下来我会给你我的分析目标和原始数据，请告诉我分析结论").append("\n");
//        userInput.append(" \"请严格按照下面的输出格式生成结果，且不得添加任何多余内容（例如无关文字、注释、代码块标记或反引号）：\\n\" +\n" +
//                "                    \"\\n\" +\n" +
//                "                    \"【【【【【\" +\n" +
//                "                    \"{ 生成 Echarts V5 的 option 配置对象 JSON 代码，要求为合法 JSON 格式且不含任何额外内容（如注释或多余字符） } 【【【【【 结论： {\\n\" +\n" +
//                "                    \"提供对数据的详细分析结论，内容应尽可能准确、详细，不允许添加其他无关文字或注释 }\\n\" +\n" +
//                "                    \"\\n\" +\n" +
//                "                    \"示例： 输入： 分析需求： 分析网站用户增长情况，请使用柱状图展示 原始数据： 日期,用户数 1号,10 2号,20 3号,30\\n\" +\n" +
//                "                    \"\\n\" +\n" +
//                "                    \"期望输出： 【【【【【 { \\\"title\\\": { \\\"text\\\": \\\"分析网站用户增长情况\\\" }, \\\"xAxis\\\": { \\\"type\\\": \\\"category\\\", \\\"data\\\": [\\\"1号\\\", \\\"2号\\\", \\\"3号\\\"] }, \\\"yAxis\\\": { \\\"type\\\": \\\"value\\\" }, \\\"series\\\": [ { \\\"name\\\": \\\"用户数\\\", \\\"type\\\": \\\"bar\\\", \\\"data\\\": [10, 20, 30] } ] } '【【【【' 结论： 从数据看，网站用户数由1号的10人增长到2号的20人，再到3号的30人，呈现出明显的上升趋势。这表明在这段时间内网站用户吸引力增强，可能与推广活动、内容更新或其他外部因素有关。").append("\n");
                userInput.append("分析目标:").append("\n");
                // 拼接分析目标
                String userGoal = goal;
                if(StringUtils.isNotBlank(chartType)){
                        userGoal += "请使用"+ chartType;
                }
                userInput.append(userGoal).append("\n");
                userInput.append("数据结果:").append("\n");
                userInput.append(csvData).append("\n");

                return userInput.toString();
        }


}
